package com.study.kt.skills.kt_java_call

import kotlin.reflect.KClass

fun main() {
    useJava()
    useClz()
    useJavaCallback()
}

// 使用Java回调
fun useJavaCallback() {
    // 第一种 类似实例化内部类
    MyResp().test(object : MyCallBack {
        override fun test(name: String?) {
            println("1. $name")
        }
    })

    // 第二种简化写法
    MyResp().test {
        println("2. $it")
    }

    // 第三种抽出变量
    val callback: MyCallBack = object : MyCallBack {
        override fun test(name: String?) {
            println("3. $name")
        }
    }
    MyResp().test(callback)

    // 第四种
    val callback2: MyCallBack = MyCallBack {
        println("4. $it")
    }
    MyResp().test(callback2)
}

// 使用字节码
private fun useClz() {
    // 参数为class
    showClz(JModel::class.java)
    showClz2(KModel::class)
}

// 调用java
private fun useJava() {
    // in是kt的关键字，可以使用``表示变量
    println(JUtils().`in`)

    // 调用java方法，返回String!,不知道是否null
    // JUtils().name.length 不建议这么使用，因为返回值可能为null
    val name: String? = JUtils().name
    // 正确使用方法
    println(name?.length)
}

// 会生成 KUtilsKt.java 类供java调用
fun testMethod() = "我是kotlin中的方法"

fun showClz(clz: Class<JModel>) {
    println(clz.name)
}

// KClass 为kotlin class类型，可以直接::class调用
fun showClz2(clz: KClass<KModel>) {
    println(clz.simpleName)
}

object KtManager {

    //  生成静态内部类并实例化 KtManager KtManager.INSTANCE.test1();
    fun test1() {
        println("test1")
    }

    // 表示java的 static方法，可以直接使用KtManager.test2()
    @JvmStatic
    fun test2() {
        println("test2")
    }
}